sanity-parallel-test-results.html

Report generated on 16-Nov-2023 at 10:26:38 by pytest-html v3.1.1

Summary

4 tests ran in 147.87 seconds.

0 passed, 0 skipped, 4 failed, 0 errors, 0 expected failures, 0 unexpected passes, 0 rerun

Results

Result Test Duration Links
Failed tests/devhub_submissions/test_addon_submissions.py::test_submit_listed_wizard_theme_tc_id_c97500[Desktop] 56.60
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="7a287e33-2e39-4c7c-88f2-99050eef5408")>, base_url = 'https://addons.mozilla.org'
variables = {'addon_validation_message': 'Your add-on was validated with no errors or warnings.', 'addon_with_stats': 'new-tab-override', 'all_scores_addon': 'ublock-origin', 'base_url': 'https://addons.mozilla.org', ...}
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x1078604d0>, delete_themes = None

@pytest.mark.sanity
@pytest.mark.failing
def test_submit_listed_wizard_theme_tc_id_c97500(selenium, base_url, variables, wait, delete_themes):
"""A test that checks a straight-forward theme submission with the devhub wizard"""
page = DevHubHome(selenium, base_url).open().wait_for_page_to_load()
page.devhub_login("submissions_user")
submit_addon = page.click_submit_theme_button()
# start the upload for a listed theme
submit_addon.select_listed_option()
submit_addon.click_continue()
create_theme = submit_addon.click_create_theme_button()
theme_name = f"wizard_theme_{reusables.get_random_string(5)}"
create_theme.set_theme_name(theme_name)
create_theme.upload_theme_header("theme_header.png")
wait.until(lambda _: create_theme.uploaded_image_preview.is_displayed())
# make a note of the image source uploaded as the theme header
uploaded_img_source = create_theme.uploaded_image_source
# verify that the uploaded image is applied in the browser preview
assert uploaded_img_source == create_theme.browser_preview_image
theme_details = create_theme.submit_theme()
# check that the name set earlier carried over
assert theme_name in theme_details.addon_name_field.get_attribute("value")
theme_details.set_addon_summary("Theme summary")
# select a category for the theme
> theme_details.theme_category_abstract.click()

tests/devhub_submissions/test_addon_submissions.py:95:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/developers/submit_addon.py:672: in theme_category_abstract
return self.find_element(*self._theme_category_abstract_locator)
venv/lib/python3.11/site-packages/pypom/view.py:34: in find_element
return self.driver_adapter.find_element(strategy, locator)
venv/lib/python3.11/site-packages/pypom/selenium_driver.py:61: in find_element
return self.driver.find_element(strategy, locator)
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:856: in find_element
return self.execute(Command.FIND_ELEMENT, {
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:429: in execute
self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x1075101d0>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: #id_categories > di.../content/shared/webdriver/Errors.sys.mjs:507:5\\ndom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16\\n"}}'}

def check_response(self, response: Dict[str, Any]) -> None:
"""
Checks that a JSON response from the WebDriver does not have an error.

:Args:
- response - The JSON response from the WebDriver server as a dictionary
object.

:Raises: If the response contains an error message.
"""
status = response.get('status', None)
if not status or status == ErrorCode.SUCCESS:
return
value = None
message = response.get("message", "")
screen: str = response.get("screen", "")
stacktrace = None
if isinstance(status, int):
value_json = response.get('value', None)
if value_json and isinstance(value_json, str):
import json
try:
value = json.loads(value_json)
if len(value.keys()) == 1:
value = value['value']
status = value.get('error', None)
if not status:
status = value.get("status", ErrorCode.UNKNOWN_ERROR)
message = value.get("value") or value.get("message")
if not isinstance(message, str):
value = message
message = message.get('message')
else:
message = value.get('message', None)
except ValueError:
pass

exception_class: Type[WebDriverException]
if status in ErrorCode.NO_SUCH_ELEMENT:
exception_class = NoSuchElementException
elif status in ErrorCode.NO_SUCH_FRAME:
exception_class = NoSuchFrameException
elif status in ErrorCode.NO_SUCH_SHADOW_ROOT:
exception_class = NoSuchShadowRootException
elif status in ErrorCode.NO_SUCH_WINDOW:
exception_class = NoSuchWindowException
elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
exception_class = StaleElementReferenceException
elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
exception_class = ElementNotVisibleException
elif status in ErrorCode.INVALID_ELEMENT_STATE:
exception_class = InvalidElementStateException
elif status in ErrorCode.INVALID_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
exception_class = InvalidSelectorException
elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
exception_class = ElementNotSelectableException
elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE:
exception_class = ElementNotInteractableException
elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
exception_class = InvalidCookieDomainException
elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
exception_class = UnableToSetCookieException
elif status in ErrorCode.TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.SCRIPT_TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.UNKNOWN_ERROR:
exception_class = WebDriverException
elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
exception_class = UnexpectedAlertPresentException
elif status in ErrorCode.NO_ALERT_OPEN:
exception_class = NoAlertPresentException
elif status in ErrorCode.IME_NOT_AVAILABLE:
exception_class = ImeNotAvailableException
elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
exception_class = ImeActivationFailedException
elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
exception_class = MoveTargetOutOfBoundsException
elif status in ErrorCode.JAVASCRIPT_ERROR:
exception_class = JavascriptException
elif status in ErrorCode.SESSION_NOT_CREATED:
exception_class = SessionNotCreatedException
elif status in ErrorCode.INVALID_ARGUMENT:
exception_class = InvalidArgumentException
elif status in ErrorCode.NO_SUCH_COOKIE:
exception_class = NoSuchCookieException
elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
exception_class = ScreenshotException
elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
exception_class = ElementClickInterceptedException
elif status in ErrorCode.INSECURE_CERTIFICATE:
exception_class = InsecureCertificateException
elif status in ErrorCode.INVALID_COORDINATES:
exception_class = InvalidCoordinatesException
elif status in ErrorCode.INVALID_SESSION_ID:
exception_class = InvalidSessionIdException
elif status in ErrorCode.UNKNOWN_METHOD:
exception_class = UnknownMethodException
else:
exception_class = WebDriverException
if not value:
value = response['value']
if isinstance(value, str):
raise exception_class(value)
if message == "" and 'message' in value:
message = value['message']

screen = None # type: ignore[assignment]
if 'screen' in value:
screen = value['screen']

stacktrace = None
st_value = value.get('stackTrace') or value.get('stacktrace')
if st_value:
if isinstance(st_value, str):
stacktrace = st_value.split('\n')
else:
stacktrace = []
try:
for frame in st_value:
line = frame.get("lineNumber", "")
file = frame.get("fileName", "<anonymous>")
if line:
file = f"{file}:{line}"
meth = frame.get('methodName', '<anonymous>')
if 'className' in frame:
meth = "{}.{}".format(frame['className'], meth)
msg = " at %s (%s)"
msg = msg % (meth, file)
stacktrace.append(msg)
except TypeError:
pass
if exception_class == UnexpectedAlertPresentException:
alert_text = None
if 'data' in value:
alert_text = value['data'].get('text')
elif 'alert' in value:
alert_text = value['alert'].get('text')
raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here
> raise exception_class(message, screen, stacktrace)
E selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: #id_categories > div:nth-child(1) > label
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:189:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:507:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16

venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py:243: NoSuchElementExceptionselenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="7a287e33-2e39-4c7c-88f2-99050eef5408")>, base_url = 'https://addons.mozilla.org'

@pytest.fixture
def delete_themes(selenium, base_url):
"""Use this fixture in devhub theme submission tests when we want to
immediately delete the theme once the test has completed"""
yield

from pages.desktop.developers.devhub_home import DevHubHome

page = DevHubHome(selenium, base_url).open().wait_for_page_to_load()
manage_addons = page.click_my_addons_header_link()
manage_addons.click_on_my_themes()
while len(manage_addons.addon_list) > 0:
addon = manage_addons.addon_list[0]
> edit = addon.click_addon_name()

tests/conftest.py:210:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/developers/addons_manage.py:64: in click_addon_name
self.find_element(*self._addon_edit_link_locator).click()
venv/lib/python3.11/site-packages/pypom/region.py:106: in find_element
return self.driver_adapter.find_element(strategy, locator, root=self.root)
venv/lib/python3.11/site-packages/pypom/selenium_driver.py:60: in find_element
return root.find_element(strategy, locator)
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webelement.py:419: in find_element
return self._execute(Command.FIND_CHILD_ELEMENT,
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webelement.py:396: in _execute
return self._parent.execute(command, params)
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:429: in execute
self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x1075101d0>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: .item.addon .info >.../content/shared/webdriver/Errors.sys.mjs:507:5\\ndom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16\\n"}}'}

def check_response(self, response: Dict[str, Any]) -> None:
"""
Checks that a JSON response from the WebDriver does not have an error.

:Args:
- response - The JSON response from the WebDriver server as a dictionary
object.

:Raises: If the response contains an error message.
"""
status = response.get('status', None)
if not status or status == ErrorCode.SUCCESS:
return
value = None
message = response.get("message", "")
screen: str = response.get("screen", "")
stacktrace = None
if isinstance(status, int):
value_json = response.get('value', None)
if value_json and isinstance(value_json, str):
import json
try:
value = json.loads(value_json)
if len(value.keys()) == 1:
value = value['value']
status = value.get('error', None)
if not status:
status = value.get("status", ErrorCode.UNKNOWN_ERROR)
message = value.get("value") or value.get("message")
if not isinstance(message, str):
value = message
message = message.get('message')
else:
message = value.get('message', None)
except ValueError:
pass

exception_class: Type[WebDriverException]
if status in ErrorCode.NO_SUCH_ELEMENT:
exception_class = NoSuchElementException
elif status in ErrorCode.NO_SUCH_FRAME:
exception_class = NoSuchFrameException
elif status in ErrorCode.NO_SUCH_SHADOW_ROOT:
exception_class = NoSuchShadowRootException
elif status in ErrorCode.NO_SUCH_WINDOW:
exception_class = NoSuchWindowException
elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
exception_class = StaleElementReferenceException
elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
exception_class = ElementNotVisibleException
elif status in ErrorCode.INVALID_ELEMENT_STATE:
exception_class = InvalidElementStateException
elif status in ErrorCode.INVALID_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
exception_class = InvalidSelectorException
elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
exception_class = ElementNotSelectableException
elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE:
exception_class = ElementNotInteractableException
elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
exception_class = InvalidCookieDomainException
elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
exception_class = UnableToSetCookieException
elif status in ErrorCode.TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.SCRIPT_TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.UNKNOWN_ERROR:
exception_class = WebDriverException
elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
exception_class = UnexpectedAlertPresentException
elif status in ErrorCode.NO_ALERT_OPEN:
exception_class = NoAlertPresentException
elif status in ErrorCode.IME_NOT_AVAILABLE:
exception_class = ImeNotAvailableException
elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
exception_class = ImeActivationFailedException
elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
exception_class = MoveTargetOutOfBoundsException
elif status in ErrorCode.JAVASCRIPT_ERROR:
exception_class = JavascriptException
elif status in ErrorCode.SESSION_NOT_CREATED:
exception_class = SessionNotCreatedException
elif status in ErrorCode.INVALID_ARGUMENT:
exception_class = InvalidArgumentException
elif status in ErrorCode.NO_SUCH_COOKIE:
exception_class = NoSuchCookieException
elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
exception_class = ScreenshotException
elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
exception_class = ElementClickInterceptedException
elif status in ErrorCode.INSECURE_CERTIFICATE:
exception_class = InsecureCertificateException
elif status in ErrorCode.INVALID_COORDINATES:
exception_class = InvalidCoordinatesException
elif status in ErrorCode.INVALID_SESSION_ID:
exception_class = InvalidSessionIdException
elif status in ErrorCode.UNKNOWN_METHOD:
exception_class = UnknownMethodException
else:
exception_class = WebDriverException
if not value:
value = response['value']
if isinstance(value, str):
raise exception_class(value)
if message == "" and 'message' in value:
message = value['message']

screen = None # type: ignore[assignment]
if 'screen' in value:
screen = value['screen']

stacktrace = None
st_value = value.get('stackTrace') or value.get('stacktrace')
if st_value:
if isinstance(st_value, str):
stacktrace = st_value.split('\n')
else:
stacktrace = []
try:
for frame in st_value:
line = frame.get("lineNumber", "")
file = frame.get("fileName", "<anonymous>")
if line:
file = f"{file}:{line}"
meth = frame.get('methodName', '<anonymous>')
if 'className' in frame:
meth = "{}.{}".format(frame['className'], meth)
msg = " at %s (%s)"
msg = msg % (meth, file)
stacktrace.append(msg)
except TypeError:
pass
if exception_class == UnexpectedAlertPresentException:
alert_text = None
if 'data' in value:
alert_text = value['data'].get('text')
elif 'alert' in value:
alert_text = value['alert'].get('text')
raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here
> raise exception_class(message, screen, stacktrace)
E selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .item.addon .info > h3 > a
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:189:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:507:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16

venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py:243: NoSuchElementException
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred. The script should be on the password input screen here. We should see "Sign in" in the header. The card header title is "Enter your password for your Mozilla account"
--------------------------------pytest-selenium---------------------------------
Driver log: /private/var/folders/v_/6jd_d5kn7ss0v8hd92jqglz80000gq/T/pytest-of-alexandru.schek/pytest-1/test_submit_listed_wizard_them0/driver.log WARNING: Failed to gather URL: HTTPConnectionPool(host='localhost', port=55838): Max retries exceeded with url: /session/7a287e33-2e39-4c7c-88f2-99050eef5408/url (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x107a6be90>: Failed to establish a new connection: [Errno 61] Connection refused')) WARNING: Failed to gather screenshot: HTTPConnectionPool(host='localhost', port=55838): Max retries exceeded with url: /session/7a287e33-2e39-4c7c-88f2-99050eef5408/screenshot (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x107a69890>: Failed to establish a new connection: [Errno 61] Connection refused')) WARNING: Failed to gather HTML: HTTPConnectionPool(host='localhost', port=55838): Max retries exceeded with url: /session/7a287e33-2e39-4c7c-88f2-99050eef5408/source (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x108a1c510>: Failed to establish a new connection: [Errno 61] Connection refused')) WARNING: Failed to gather log types: HTTPConnectionPool(host='localhost', port=55838): Max retries exceeded with url: /session/7a287e33-2e39-4c7c-88f2-99050eef5408/se/log/types (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x108a1ec50>: Failed to establish a new connection: [Errno 61] Connection refused'))
Failed tests/devhub_submissions/test_addon_submissions.py::test_submit_listed_addon_tc_id_c4369[Desktop] 39.35
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="8a3ad2ed-7f96-464f-a386-6b6ed3820bac")>, base_url = 'https://addons.mozilla.org'
variables = {'addon_validation_message': 'Your add-on was validated with no errors or warnings.', 'addon_with_stats': 'new-tab-override', 'all_scores_addon': 'ublock-origin', 'base_url': 'https://addons.mozilla.org', ...}
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x1079ad210>

@pytest.mark.sanity
@pytest.mark.serial
@pytest.mark.create_session("submissions_user")
@pytest.mark.failing
def test_submit_listed_addon_tc_id_c4369(selenium, base_url, variables, wait):
"""Test covering the process of uploading a listed addon"""
page = DevHubHome(selenium, base_url).open().wait_for_page_to_load()
> submit_addon = page.click_submit_addon_button()

tests/devhub_submissions/test_addon_submissions.py:225:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/developers/devhub_home.py:294: in click_submit_addon_button
self.wait_for_element_to_be_clickable(self._submit_addon_button_locator)
pages/desktop/base.py:46: in wait_for_element_to_be_clickable
self.wait.until(EC.element_to_be_clickable(element))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="8a3ad2ed-7f96-464f-a386-6b6ed3820bac")>, method = <function element_to_be_clickable.<locals>._predicate at 0x107a8fd80>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:189:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:507:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/devhub_submissions/test_addon_submissions.py::test_submit_addon_3mb_size_tc_id_c2274214[Desktop] 35.31
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="a6a4d053-8f00-49a0-9b5d-5b7b7afe30b2")>, base_url = 'https://addons.mozilla.org'
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x10798f590>
variables = {'addon_validation_message': 'Your add-on was validated with no errors or warnings.', 'addon_with_stats': 'new-tab-override', 'all_scores_addon': 'ublock-origin', 'base_url': 'https://addons.mozilla.org', ...}

@pytest.mark.sanity
@pytest.mark.serial
@pytest.mark.create_session("submissions_user")
@pytest.mark.failing
def test_submit_addon_3mb_size_tc_id_c2274214(selenium, base_url, wait, variables):
"""Test covering the process of uploading a listed addon with 3-4 mb in size"""
page = DevHubHome(selenium, base_url).open().wait_for_page_to_load()
> submit_addon = page.click_submit_addon_button()

tests/devhub_submissions/test_addon_submissions.py:282:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/developers/devhub_home.py:294: in click_submit_addon_button
self.wait_for_element_to_be_clickable(self._submit_addon_button_locator)
pages/desktop/base.py:46: in wait_for_element_to_be_clickable
self.wait.until(EC.element_to_be_clickable(element))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="a6a4d053-8f00-49a0-9b5d-5b7b7afe30b2")>, method = <function element_to_be_clickable.<locals>._predicate at 0x107a8f6a0>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:189:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:507:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_sanity.py::test_about_addons_addon_cards_author_link[Desktop] 15.30
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="c2e9b803-e9cf-47a3-bb5c-7fa4a83d83f8")>, base_url = 'https://addons.mozilla.org'
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x108aa8250>

@pytest.mark.prod_only
@pytest.mark.failing
def test_about_addons_addon_cards_author_link(selenium, base_url, wait):
selenium.get("about:addons")
about_addons = AboutAddons(selenium)
# waiting for the addon cards data to be retrieved (the author names in this case)
wait.until(
lambda _: len([el.disco_addon_author for el in about_addons.addon_cards_items])
>= 7
)
disco_addon_name = about_addons.addon_cards_items[0].disco_addon_name.text
# clicking on the author link should open the addon detail page on AMO
amo_detail_page = about_addons.addon_cards_items[0].click_disco_addon_author()
# checking that the expected detail page was opened
> wait.until(lambda _: disco_addon_name == amo_detail_page.name)

tests/frontend/test_sanity.py:169:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x108aa8250>
method = <function test_about_addons_addon_cards_author_link.<locals>.<lambda> at 0x107b11a80>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:189:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:507:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:132:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException